package jp.seraph.jsade.effector;

import java.util.List;

import jp.seraph.jsade.math.AngleVelocity;
import jp.seraph.jsade.model.Joint;

/**
 * エフェクタの生成機を表すインターフェースです。
 *
 *
 */
public interface EffectorBuilder {
    /**
     * 生成されるエフェクタ列に、引数の値をもつ引数の種類のエフェクタを追加します。
     *
     * @param aEffector
     * @param aValue
     * @throws IllegalArgumentException
     */
    public void append(EffectorKind aEffector, String aValue) throws IllegalArgumentException;

    /**
     * 生成されるエフェクタ列に、引数の値をもつ引数の種類のエフェクタを追加します。
     *
     * @param aEffector
     * @param aValue
     * @throws IllegalArgumentException
     */
    public void append(EffectorKind aEffector, String... aValue) throws IllegalArgumentException;

    /**
     * 生成されるエフェクタ列に、引数の値をもつ引数の種類のエフェクタを追加します。
     *
     * @param aEffector
     * @param aValue
     * @throws IllegalArgumentException
     */
    public void append(EffectorKind aEffector, double aValue) throws IllegalArgumentException;

    /**
     * 生成されるエフェクタ列に、引数の値をもつ引数の種類のエフェクタを追加します。
     *
     * @param aEffector
     * @param aValue
     * @throws IllegalArgumentException
     */
    public void append(EffectorKind aEffector, double... aValue) throws IllegalArgumentException;

    /**
     * 生成されるエフェクタ列に、引数の値をもつ引数の種類のエフェクタを追加します。
     *
     * @param aEffector
     * @param aValue
     * @throws IllegalArgumentException
     */
    public void append(EffectorKind aEffector, int aValue) throws IllegalArgumentException;

    /**
     * 生成されるエフェクタ列に、引数の値をもつ引数の種類のエフェクタを追加します。
     *
     * @param aEffector
     * @param aValue
     * @throws IllegalArgumentException
     */
    public void append(EffectorKind aEffector, int... aValue) throws IllegalArgumentException;

    /**
     * 生成されるエフェクタ列に、引数の値をもつ引数の種類のエフェクタを追加します。
     *
     * @param aEffector
     * @throws IllegalArgumentException
     */
    public void append(Effector aEffector) throws IllegalArgumentException;

    /**
     * 対象ジョイントの角速度を引数の値に設定するエフェクタを追加します。
     *
     * @param aTargetJoint
     * @param aValue 角速度 エフェクタに直接この値が使用されます
     * @throws IllegalArgumentException
     */
    public void appendJoint(Joint aTargetJoint, double aValue) throws IllegalArgumentException;

    /**
     * 対象ジョイントの角速度を引数の値にするエフェクタを追加します。
     *
     * @param aTargetJoint
     * @param aVelocity 角速度 単位系による調整を行った値がエフェクタに使用されます
     * @throws IllegalArgumentException
     */
    public void appendJoint(Joint aTargetJoint, AngleVelocity aVelocity) throws IllegalArgumentException;

    /**
     * 引数の座標に移動するBeamエフェクタを追加します
     *
     * @param aX
     * @param aY
     * @param aZ
     * @throws IllegalArgumentException
     */
    public void appendBeam(double aX, double aY, double aZ) throws IllegalArgumentException;

    /**
     * 引数の値を持つSayエフェクタを追加します。
     *
     * @param aMessage
     */
    public void appendSay(String aMessage);

    /**
     * このBuilderを初期化します。
     *
     */
    public void clear();

    /**
     * エフェクタ列を生成します。
     *
     * @return
     */
    public List<Effector> buildEffector();
}
